﻿using Mysoft.QuickCode.NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mysoft.QuickCode.Office.Excel.Data
{
    /// <summary>
    /// Excel单元格样式普通配置信息。
    /// Excel中单元格样式超过4000个就挂掉了。因此通过此属性可以用于排除重复的样式信息，如果存在相同的配置单元格，则公用一个Excel单元格样式。
    /// </summary>
    public class ExcelCell
    {
        public ExcelCell()
        {
            Settings = new ExcelCellSetting();
            CellType = NPOI.SS.UserModel.CellType.Unknown;
            BackgroundColor = NPOI.HSSF.Util.HSSFColor.COLOR_NORMAL;
        }

        /// <summary>
        /// 初始化单元格数据
        /// </summary>
        /// <param name="field">字段名称，类似DataTable里的字段的唯一名称</param>
        /// <param name="text">字段内容，类似DataTable里的字段值</param>
        public ExcelCell(string field, string text)
            : this()
        {
            this.Field = field;
            this.Text = text;
        }

        /// <summary>
        /// 是否为摘要说明单元格
        /// </summary>
        public bool IsSummary { set; get; }

        /// <summary>
        /// 是否标题类型
        /// </summary>
        public bool IsTitle { set; get; }
        /// <summary>
        /// 单元格对应的表字段名称
        /// </summary>
        public string Field { set; get; }
        /// <summary>
        /// 字段对应的表格文本内容
        /// </summary>
        /// <value>The text.</value>
        public string Text { set; get; }

        /// <summary>
        /// 没有前后空格的文本内容，主要用于作比较用
        /// </summary>
        public string TrimText
        {
            get
            {
                return (Text ?? "").Trim();
            }
        }

        /// <summary>
        /// 单元格所在的列分组
        /// </summary>
        public string ColumnGroup { set; get; }

        /// <summary>
        /// 宽度
        /// </summary>
        /// <value>The width.</value>
        public int Width { set; get; }

        /// <summary>
        /// 高度
        /// </summary>
        public int Height { set; get; }
        /// <summary>
        /// 水平对齐方式
        /// </summary>
        /// <value>left,center,right</value>
        public string Align { set; get; }

        /// <summary>
        /// 背景色：NPOI.HSSF.Util.HSSFColor的值
        /// </summary>
        public short BackgroundColor { set; get; }

        /// 文字色：NPOI.HSSF.Util.HSSFColor的值
        /// </summary>
        public short FontColor { set; get; }

        /// <summary>
        /// 自定义单元格数据类型，导出时优先级大于CellType数据类型（number、string、date）
        /// </summary>
        public string DataType { set; get; }
        /// <summary>
        /// 数据格式化。跟Excel里的格式化字符串格式一样。
        /// </summary>
        public string DataFormat { set; get; }

        /// <summary>
        /// 字段数据类型
        /// </summary>
        public CellType CellType { set; get; }

        /// <summary>
        /// 在Excel单元格中的单元格位置。如果是内部高级导出功能，则会自动渲染，无需赋值。
        /// </summary>
        public string XY { set; get; }

        /// <summary>
        /// 在Excel单元格中的单元格位置。如果是内部高级导出功能，则会自动渲染，无需赋值。但是是绝对地址引用，例如：$A$1
        /// </summary>
        public string AbsoluteXY { set; get; }
        
        /// <summary>
        /// 属于冻结列中的单元格
        /// </summary>
        public bool ColumnFreeze { set; get; }

        /// <summary>
        /// 单元格的高级设置信息，此属性不会为null值。
        /// </summary>
        /// <value>The settings.</value>
        public ExcelCellSetting Settings { set; get; }
    }

    /// <summary>
    /// Excel单元格样式普通配置信息泛型模式。泛型对象可以用于存储用户数据对象。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ExcelCell<T> : ExcelCell
    {
        /// <summary>
        /// 用户数据对象
        /// </summary>
        public T Data { set; get; }
    }
}
